// -----------------------------------创建 Axios 实例-----------------------------------
// 先导入，再使用
import axios from "axios";

// 创建 Axios 实例，将来调用这个实例对象的方法发送请求
let axiosInstance = axios.create({
    timeout: 10000, // 前端给后端发送请求的超时时间
    baseURL: "/"
});

// -----------------------------------开发 Axios 拦截器-----------------------------------
// 1、请求拦截
// use() 函数参数一：发送请求前的准备工作执行成功后，给我们留出的钩子
// use() 函数参数二：发送请求前的准备工作执行失败后，给我们留出的钩子
axiosInstance.interceptors.request.use(config => {
    // 当前回调函数，可以借助 config 对象做一些全局性的操作
    // 例如：设置请求消息头
    config.headers.token = "EEEEFFFFFAAAA2225555";

    // 在控制台打印信息，证明拦截器中的这一步执行了
    console.log("request 成功")

    // 当前回调函数，必须把 config 对象返回，否则后续操作就获取不到 config 对象了
    return config;
}, error => {

    // 在控制台打印信息，证明拦截器中的这一步执行了
    console.log("request 失败")

    // 返回值：封装一个失败状态的 Promise 对象返回
    // Promise.reject() 函数：跳过执行主体任务，直接返回一个失败状态的 Promise 对象
    return Promise.reject(error);
});

// 2、响应拦截
// use() 函数参数一：解析响应数据后，响应状态码 2XX 情况，给我们留出的钩子
// use() 函数参数二：解析响应数据后，响应状态码 2XX 以外的情况，给我们留出的钩子
axiosInstance.interceptors.response.use(response => {

    // 在控制台打印信息，证明拦截器中的这一步执行了
    console.log("response 成功")

    // 当前回调函数一定要把 response 对象返回，否则后续操作就没有 response 对象使用了
    return response;

}, error => {

    // 在控制台打印信息，证明拦截器中的这一步执行了
    console.log("response 失败")

    // 返回值：封装一个失败状态的 Promise 对象返回
    // Promise.reject() 函数：跳过执行主体任务，直接返回一个失败状态的 Promise 对象
    return Promise.reject(error);
});

// 默认导出，方便其它组件使用
export default axiosInstance;